﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using Commons.Entity;
using Commons.Entity.CommonEnums;
using Commons.Web.Helpers;
using VCommons;
using System.Text;
using Common.Background.Service;
using EF.Commons.Background.Entity;
namespace System.Web.Mvc.Html
{
    /// <summary>
    /// 对.net托管类型的扩展
    /// </summary>
    public static class NetExtensions
    {
        #region 超链接的扩展

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   userOperatorRole:
        //     操作权限。
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
                return htmlHelper.ActionLink(linkText, actionName, null, new { @class = "button" });
        }



        /// <summary>
        /// 自定义链接，带有带来包状态及权限控制的
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="linkText"></param>
        /// <param name="actionName"></param>
        /// <param name="routeValues"></param>
        /// <param name="userOperatorRole"></param>
        /// <returns></returns>
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
                return htmlHelper.ActionLink(linkText, actionName, routeValues, new { @class = "button" });
        }

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   routeValues:
        //     一个包含路由参数的对象。
        //
        //
        //    userOperatorRole:
        //     操作的权限。
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
                return htmlHelper.ActionLink(linkText, actionName, routeValues, new { @class = "button" });
        }

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   controllerName:
        //     控制器的名称。
        //
        //
        //   userOperatorRole:
        //     操作的权限。
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
                return htmlHelper.ActionLink(linkText, actionName, controllerName, new { @class = "button" });
        }

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   routeValues:
        //     一个包含路由参数的对象。 通过检查对象的属性，利用反射检索参数。 该对象通常是使用对象初始值设定项语法创建的。
        //
        //   htmlAttributes:
        //     包含元素 HTML 特性的对象。 通过检查对象的属性，利用反射检索特性。 该对象通常是使用对象初始值设定项语法创建的。
        //
        //
        //   userOperatorRole:
        //     操作的权限。
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, object routeValues, object htmlAttributes, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) != 0)
                return htmlHelper.ActionLink(linkText, actionName, routeValues, htmlAttributes ?? new { @class = "button" });
            else
                return null;
        }

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   routeValues:
        //     一个包含路由参数的对象。
        //
        //   htmlAttributes:
        //     一个对象，其中包含要为该元素设置的 HTML 特性。
        //
        //
        //   userOperatorRole:
        //     操作的权限。
        //
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
                return htmlHelper.ActionLink(linkText, actionName, routeValues, new { @class = "button" });
        }

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   controllerName:
        //     控制器的名称。
        //
        //   routeValues:
        //     一个包含路由参数的对象。 通过检查对象的属性，利用反射检索参数。 该对象通常是使用对象初始值设定项语法创建的。
        //
        //   htmlAttributes:
        //     一个对象，其中包含要为该元素设置的 HTML 特性。
        //
        //
        //    userOperatorRole:
        //     操作的权限。
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, object htmlAttributes, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
            {
                return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, new { @class = "button" });

            }

        }

        /// <summary>
        /// 代权限的链接
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="linkText"></param>
        /// <param name="actionName"></param>
        /// <param name="controllerName"></param>
        /// <param name="routeValues"></param>
        /// <param name="userOperatorRole"></param>
        /// <returns></returns>
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, object routeValues, Enum userOperatorRole)
        {
            return htmlHelper.ActionLink(linkText, actionName, controllerName, routeValues, new { @class = "button" });
        }

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   controllerName:
        //     控制器的名称。
        //
        //   protocol:
        //     URL 协议，如“http”或“https”。
        //
        //   hostName:
        //     URL 的主机名。
        //
        //   fragment:
        //     URL 片段名称（定位点名称）。
        //
        //   routeValues:
        //     一个包含路由参数的对象。 通过检查对象的属性，利用反射检索参数。 该对象通常是使用对象初始值设定项语法创建的。
        //
        //   htmlAttributes:
        //     一个对象，其中包含要为该元素设置的 HTML 特性。
        //
        //
        //    userOperatorRole:
        //     操作的权限。
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, object routeValues, object htmlAttributes, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
                return htmlHelper.ActionLink(linkText, actionName, controllerName, protocol, hostName, fragment, null, new { @class = "button" });
        }

        //
        // 摘要:
        //     Returns an anchor element (a element) that contains the virtual path of the
        //     specified action.
        //
        // 参数:
        //   htmlHelper:
        //     此方法扩展的 HTML 帮助器实例。
        //
        //   linkText:
        //     定位点元素的内部文本。
        //
        //   actionName:
        //     操作的名称。
        //
        //   controllerName:
        //     控制器的名称。
        //
        //   protocol:
        //     URL 协议，如“http”或“https”。
        //
        //   hostName:
        //     URL 的主机名。
        //
        //   fragment:
        //     URL 片段名称（定位点名称）。
        //
        //   routeValues:
        //     一个包含路由参数的对象。
        //
        //   htmlAttributes:
        //     一个对象，其中包含要为该元素设置的 HTML 特性。
        //
        //
        //   UserOperatorRole userOperatorRole:
        //     操作的权限。
        //
        // 返回结果:
        //     An anchor element (a element).
        //
        // 异常:
        //   System.ArgumentException:
        //     linkText 参数为 null 或为空。
        public static MvcHtmlString ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName, string protocol, string hostName, string fragment, RouteValueDictionary routeValues, IDictionary<string, object> htmlAttributes, Enum userOperatorRole)
        {
            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
                return null;
            else
                return htmlHelper.ActionLink(linkText, actionName, controllerName, protocol, hostName, fragment, null, new { @class = "button" });
        }

        #endregion 超链接的扩展

        #region 自定义的超链接，为权限设计

        /// <summary>
        /// 自定义链接，根据包的状态及用户的权限控制按钮是否被显示，产生A标签的ID属性
        /// 自定义链接，带有权限控制的
        /// 用于调用一个JS方法
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="linkText">链接名称</param>
        /// <param name="js">是否是JS方法</param>
        /// <param name="url">JS方法名或URL</param>
        /// <param name="userOperatorRole">权限 </param>
        /// <returns></returns>
        public static MvcHtmlString CreateActionLink(this HtmlHelper htmlHelper, string id, string linkText, bool js, string url, Enum userOperatorRole)
        {

            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) != 0)
            {
                if (js)
                {
                    if (string.IsNullOrEmpty(id))
                        return MvcHtmlString.Create("<a class=\"button\" href=\"javascript:void(0)\" onclick=\"" + url + ";return false;\")' title=\"" + linkText + "\">" + linkText + "</a>");
                    else
                        return MvcHtmlString.Create("<a id=\"" + id + "\" name=\"" + id + "\" class=\"button\" href=\"javascript:void(0)\" onclick=\"" + url + ";return false;\")' title=\"" + linkText + "\">" + linkText + "</a>");
                }
                else
                {
                    return MvcHtmlString.Create("<a  class=\"button\" href=\"" + url + "\"  title=\"" + linkText + "\">" + linkText + "</a>");
                }
            }

            else
                return null;
        }
        /// <summary>
        /// 自定义链接，带有权限控制的
        /// 不产生A标签的ID属性
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="linkText"></param>
        /// <param name="js"></param>
        /// <param name="url"></param>
        /// <param name="userOperatorRole"></param>
        /// <returns></returns>
        public static MvcHtmlString CreateActionLink(this HtmlHelper htmlHelper, string linkText, bool js, string url, Enum userOperatorRole)
        {
            return CreateActionLink(htmlHelper, " ", linkText, true, url, userOperatorRole);
        }
        /// <summary>
        /// 自定义链接，带有权限控制的
        /// 进行普通的链接跳转
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="linkText">链接名称</param>
        /// <param name="url">链接地址</param>
        /// <param name="userOperatorRole">权限</param>
        /// <returns></returns>
        public static MvcHtmlString CreateActionLink(this HtmlHelper htmlHelper, string linkText, string url, Enum userOperatorRole)
        {
            return CreateActionLink(htmlHelper, " ", linkText, false, url, userOperatorRole);
        }


        #region 按钮的扩展

        /// <summary>
        /// 按钮对象，只产生按钮，对按钮的click等事件需要在具体页面自己添加
        /// </summary>
        /// <param name="html"></param>
        /// <param name="buttonName">按钮ID</param>
        /// <param name="displayName">按钮显示名称</param>
        /// <param name="userOperatorRole">按钮权限</param>
        /// <param name="buttonType">按钮类型</param>
        /// <returns></returns>
        public static MvcHtmlString CreateButton(this HtmlHelper html, string buttonName, string displayName, Enum userOperatorRole, ButtonType buttonType)
        {

            string tag = string.Format("<input type='{0}' name='{1}' id='{2}' value='{3}' class='button'>"
                , buttonType.ToString()
                , buttonName
                , buttonName
                , displayName
                );

            if ((Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole")) & Convert.ToInt32(userOperatorRole)) == 0)
            {
                tag = string.Format("<input disabled='disabled' type='{0}' name='{1}' id='{2}' value='{3}' class='button gray'>"
             , buttonType.ToString()
             , buttonName
             , buttonName
             , displayName
             );
            }
            return MvcHtmlString.Create(tag.ToString());
        }



        /// <summary>
        /// 按钮对象，只产生按钮，对按钮的click等事件需要在具体页面自己添加
        /// ID默认为button
        /// </summary>
        /// <param name="html"></param>
        /// <param name="userOperatorRole">按钮权限</param>
        /// <returns></returns>
        public static MvcHtmlString CreateButton(this HtmlHelper html, Enum userOperatorRole, ButtonType buttonType)
        {
            return CreateButton(html, "Button", "提交", userOperatorRole, buttonType);
        }

        /// <summary>
        /// 按钮对象，只产生按钮，对按钮的click等事件需要在具体页面自己添加
        /// ID默认为button
        /// 按钮类型为Submit
        /// </summary>
        /// <param name="html"></param>
        /// <param name="userOperatorRole"></param>
        /// <returns></returns>
        public static MvcHtmlString CreateButton(this HtmlHelper html, Enum userOperatorRole)
        {
            return CreateButton(html, "Button", "提交", userOperatorRole, ButtonType.Submit);
        }

        /// <summary>
        /// 按钮对象，只产生按钮，对按钮的click等事件需要在具体页面自己添加
        /// </summary>
        /// <param name="html"></param>
        /// <param name="buttonName">按钮ID</param>
        /// <param name="userOperatorRole">按钮权限</param>
        /// <param name="buttonType">按钮类型</param>
        /// <returns></returns>
        public static MvcHtmlString CreateButton(this HtmlHelper html, string buttonName, Enum userOperatorRole, ButtonType buttonType)
        {
            return CreateButton(html, buttonName, "提交", userOperatorRole, buttonType);
        }

        /// <summary>
        /// 按钮对象，只产生按钮，对按钮的click等事件需要在具体页面自己添加
        /// 按钮类型为Submit
        /// </summary>
        /// <param name="html"></param>
        /// <param name="buttonName">按钮ID</param>
        /// <param name="userOperatorRole">按钮权限</param>
        /// <returns></returns>
        public static MvcHtmlString CreateButton(this HtmlHelper html, string buttonName, Enum userOperatorRole)
        {
            return CreateButton(html, buttonName, "提交", userOperatorRole, ButtonType.Submit);
        }

        #endregion 按钮的扩展

        #endregion 自定义的超链接，为权限设计

        #region 资源文本框
        /// <summary>
        /// 文本框，带onblur事件
        /// </summary>
        /// <param name="htmlHelper"></param>
        /// <param name="style"></param>
        /// <param name="value"></param>
        /// <param name="onblur"></param>
        /// <param name="userOperatorRole"></param>
        /// <returns></returns>
        public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string style, string value, string onblur, UserOperatorRole userOperatorRole, int? status)
        {
            if ((((UserOperatorRole)Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole"))) & userOperatorRole) != 0)
                return MvcHtmlString.Create("<input style=\"" + style + "\" type=\"text\" value=\"" + value + "\" onblur=\"" + onblur + "\">");
            else
                return MvcHtmlString.Create(value);
        }
        public static MvcHtmlString TextBox(this HtmlHelper htmlHelper, string style, string value, string onblur, UserOperatorRole userOperatorRole, int? status, string tit)
        {
            if ((((UserOperatorRole)Convert.ToInt32(SessionAction.ReadSession("UserOperatorRole"))) & userOperatorRole) != 0)
                return MvcHtmlString.Create("<input style=\"" + style + "\" type=\"text\" value=\"" + value + "\" title=\"" + tit + "\" onblur=\"" + onblur + "\">");
            else
                return MvcHtmlString.Create(value);
        }
        #endregion

        #region 权限 复选框

        /// <summary>
        /// 权限列表复选框
        /// </summary>
        /// <param name="html"></param>
        /// <param name="selectedValue">选中的项</param>
        /// <returns></returns>
        public static MvcHtmlString UserOperationForCheckBox(this HtmlHelper html, int selectedValue)
        {
            StringBuilder sb = new StringBuilder();
            int i = 0;
            foreach (var item in new WebManagePermissionsServices().GetWebManagePermissions())
            {
                i++;
                if ((selectedValue & item.PermissionsID) != 0)
                    sb.Append("<input type=checkbox name='OperatorAuthority' id='OperatorAuthority" + i + "' checked='checked' value='" + (int)item.PermissionsID + "' ><label for='OperatorAuthority" + i + "'><font color='red'>" + item.Name + "</font></label>");
                else
                    sb.Append("<input type=checkbox name='OperatorAuthority' id='OperatorAuthority" + i + "' value='" + (int)item.PermissionsID + "'><label for='OperatorAuthority" + i + "'>" + item.Name + "</label>");
                if (i % 6 == 0) sb.Append("<br>");
            }
            return MvcHtmlString.Create(sb.ToString());
        }

        /// <summary>
        /// 权限列表复选框
        /// </summary>
        /// <param name="html"></param>
        /// <returns></returns>
        public static MvcHtmlString UserOperationForCheckBox(this HtmlHelper html)
        {
            return UserOperationForCheckBox(html, 1);
        }

        #endregion 权限 复选框

        #region 输出Flags特性的枚举的描述信息
        public static MvcHtmlString UserOperationList(this HtmlHelper html, int value)
        {
            StringBuilder str = new StringBuilder();
            foreach (UserOperatorRole item in Enum.GetValues(typeof(UserOperatorRole)))
            {
                if (((UserOperatorRole)value & item) != 0)
                    str.AppendFormat("{0},", item.GetDescription());
            }
            return MvcHtmlString.Create(str.ToString());
        }
        #endregion
    }
}